package com.atguigu_e_waitandnotify;

import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;

/*
    厨师类 :
        1. 事物描述类
        2. 线程类
 */
public class Cook extends Thread implements Serializable {
    @Serial
    private static final long serialVersionUID = 1691915644552587409L;
    //属性 : 姓名 -> 父类Thread
    //属性 : 持有包子 -> 包子
    private BaoZi bz;

    //先继承再生成构造方法

    public Cook() {

    }

    public Cook(String name, BaoZi bz) {
        super(name);
        this.bz = bz;
    }

    public BaoZi getBz() {
        return bz;
    }

    public void setBz(BaoZi bz) {
        this.bz = bz;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cook cook = (Cook) o;
        return Objects.equals(bz, cook.bz);
    }

    @Override
    public int hashCode() {
        return Objects.hash(bz);
    }

    @Override
    public String toString() {
        return "Cook{" +
                "bz=" + bz +
                '}';
    }

    //厨子类还是个线程类 -> 重写父类的run方法
    @Override
    public void run() {
        //定义统计变量
        int count = 0; //只创建一个厨子线程,所以没有必要移动到run方法的外面
        //死循环 : 顾客一直吃,厨子就一直做
        while (true){
            //同步代码块保证线程安全
            synchronized (bz){

                //什么时候厨子线程停[等待]
                if (bz.isFlag()){//bz.isFlag() == true
                    //能进来说明有包子-> 包子的状态就是true
                    //无限等待 -> 不知道顾客什么时候吃完
                    try {
                        bz.wait(); //释放锁和释放CPU执行权
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }


                //能从上方if走下来 说明没有包子 -> 状态是false


                //需要对包子的馅属性赋值 -> 奇数次 偶数次做的馅不一样
                if (count % 2 == 0){//count : 统计做包子的次数
                    //偶数次
                    bz.setXianer("西葫芦鸡蛋馅");
                }else{
                    //奇数次
                    bz.setXianer("茴香肉末馅");
                }

                //统计变量自增
                count++;


                System.out.println("姓名是 : " + getName() + " 的厨师正在做 " + bz.getXianer() + " 的包子  !!");
                //假设做包子花费5秒钟
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(bz.getXianer() + " 的包子已经出炉了 ! 大家快来抢购吧 !!");

                //真正做包子的语句是修改包子的状态
                bz.setFlag(true);

                //真正吆喝的语句 是唤醒顾客
                bz.notify();

            }
        }
    }
}
